// Package router
// @Title router[简述该包的主要作用]
// @Description
// @Author  cnHuaShao
// @since v0.0.1
// @Version v1.0.0
// @Date 2024/4/21 22:34
// @Update 2024/4/21 22:34
package router

import (
	"FinancialManagement/src/base/baselog"
	"FinancialManagement/src/base/config"
	"FinancialManagement/src/business/api"
	"github.com/gin-contrib/sessions"
	"github.com/gin-contrib/sessions/cookie"
	"github.com/gin-gonic/gin"
	"net/http"
)

// InitRouter
// @Description: 初始网关
// @param r
func InitRouter(r *gin.Engine) {
	// 在这里我们进行初始化各种网关配置

	// 加载404错误页面
	r.NoRoute(func(c *gin.Context) {
		baselog.Logger.Error(c.Request.RequestURI + " is 404")
		c.JSON(http.StatusNotFound, c.Request.RequestURI+" is 404")
	})

	store := cookie.NewStore([]byte("secret"))
	store.Options(sessions.Options{
		Path:   "/",
		MaxAge: 0,
	})
	r.Use(sessions.Sessions("sessionid", store))
	// 设置全部API接口的OPTION方式
	r.Use(cors())
	// 设置gin框架使用zap日志
	r.Use(baselog.GinLogger(baselog.Logger), baselog.GinRecovery(baselog.Logger, true))
	// 设置500提示中间件
	r.Use(errorHttp)
	// XSS攻击和SQL注入防护策略
	r.Use(api.CheckXSSSQLInject)
	// 管理服务类相关网关接口
	managementServiceRouter(r)

}

// managementServiceRouter
// @Description: 管理服务相关网关，主要用于后端服务管理的网关
// @param r
func managementServiceRouter(r *gin.Engine) {
	rg := r.Group(config.Get().Base.UrlPosition)
	// 验证码
	initCommonRouter(rg)
	rg.StaticFS("/static", http.Dir(config.SysConfigDir+"/static"))
	rg.StaticFile("/public.pem", config.SysConfigDir+"/public.pem")
	// 全局认证拦截器
	rg.Use(JWTAuth())
	// 获取登录用户信息
	rg.POST("/getUserInfo", api.GetUserInfo)
	// 获取当前登录用户授权的菜单
	rg.POST("/getMenuList", api.GetMenuList)

	// 获取所有库存信息列表，可模糊搜索
	rg.POST("/inventory/getInventoryList", api.GetInventoryList)
	// 获取所有库存类型列表，可模糊搜索
	rg.POST("/inventory/getInventoryTypeList", api.GetInventoryTypeList)
	// 删除指定库存类型
	rg.POST("/inventory/delInventoryType", api.DelInventoryType)
	// 创建库存类型
	rg.POST("/inventory/createInventoryType", api.CreateInventoryType)

	// 获取所有产品信息，分页
	rg.POST("/product/getProductList", api.GetProductList)
	// 获取所有产品信息，不分页
	rg.POST("/product/getProductListAll", api.GetProductListAll)
	// 依据采购id获取产品信息列表
	rg.POST("/product/getProductListForPurchaseId", api.GetProductListForPurchaseId)
	// 获取指定产品信息
	rg.POST("/product/getProductInfo", api.GetProductInfo)
	// 创建产品信息
	rg.POST("/product/createProductInfo", api.CreateProductInfo)
	// 修改指定产品信息
	rg.POST("/product/updateProductInfo", api.UpdateProductInfo)
	// 删除指定产品信息
	rg.POST("/product/delProductInfo", api.DelProductInfo)

	// 获取所有客户信息
	rg.POST("/customer/getCustomerList", api.GetCustomerList)
	// 获取所有客户信息，不分页
	rg.POST("/customer/getCustomerListAll", api.GetCustomerListAll)
	// 创建客户信息
	rg.POST("/customer/createCustomerInfo", api.CreateCustomerInfo)
	// 修改指定客户信息
	rg.POST("/customer/updateCustomerInfo", api.UpdateCustomerInfo)
	// 删除指定客户信息
	rg.POST("/customer/delCustomerInfo", api.DelCustomerInfo)
	// 获取省市区信息列表
	rg.POST("/getProvincesCities", api.GetProvincesCities)
	// 获取入库信息列表
	rg.POST("/stock/getStockInList", api.GetStockInList)
	// 添加入库信息
	rg.POST("/stock/addStockInInfo", api.AddStockInInfo)

	// 获取特定年份下不同采购车辆的实际采购总金额、总数量、总运费
	rg.POST("/common/getAnnualProcurementOfVehicles", api.GetAnnualProcurementOfVehicles)
	// 获取特定年份下不同车辆的实际销售总金额、总利润
	rg.POST("/common/getActualSalesOfVehicles", api.GetActualSalesOfVehicles)
	// 依据年份、客户ID获取不同客户采购总金额和斤数
	rg.POST("/common/getPurchaseListOfYear", api.GetPurchaseListOfYear)
	// 依据年份、客户ID获取不同客户销售总金额和斤数
	rg.POST("/common/getSalesListOfYear", api.GetSalesListOfYear)
	// //////////////////////////////////////////////////////
	// 销售相关网关
	// 获取销售信息列表
	rg.POST("/sales/getSalesDetailList", api.GetSalesDetailList)
	// 添加销售信息
	rg.POST("/sales/addSalesDetail", api.CreateSalesDetail)
	// 获取销售订单与销售明细详情
	rg.POST("/sales/getSalesDetailInfo", api.GetSalesDetailInfo)
	// 修改销售订单基本信息
	rg.POST("/sales/updateSalesDetail", api.UpdateSalesDetail)

	// 删除指定销售单
	rg.POST("/sales/deleteSalesDetailInfo", api.DeleteSalesDetailInfo)
	// 依据采购单信息进行更新销售单中的各项内容
	rg.POST("/sales/updateSalesInfoOnPurchase", api.UpdateSalesInfoOnPurchase)

	// 添加销售明细
	rg.POST("/sales/addSalesDetailItem", api.AddSalesDetailItem)
	// 修改指定销售明细信息
	rg.POST("/sales/updateSalesDetailItem", api.UpdateSalesDetailItem)
	// 删除指定销售明细信息
	rg.POST("/sales/deleteSalesDetailItemInfo", api.DeleteSalesDetailItemInfo)

	// //////////////////////////////////////////////////////
	// 采购相关网关
	// 获取采购信息列表
	rg.POST("/purchase/getPurchaseList", api.GetPurchaseList)
	// 添加采购信息
	rg.POST("/purchase/createPurchaseInfo", api.CreatePurchaseInfo)
	// 获取采购信息详情
	rg.POST("/purchase/getPurchaseInfo", api.GetPurchaseInfo)
	// 修改采购信息
	rg.POST("/purchase/updatePurchaseInfo", api.UpdatePurchaseInfo)
	// 删除指定采购单
	rg.POST("/purchase/delPurchaseInfo", api.DelPurchaseInfo)
	// 添加采购明细
	rg.POST("/purchase/addPurchaseDetailItem", api.AddPurchaseDetailItem)
	// 删除指定采购单明细信息
	rg.POST("/purchase/delPurchaseDetailItem", api.DelPurchaseDetailItem)
	// 修改采购明细
	rg.POST("/purchase/updatePurchaseDetailItem", api.UpdatePurchaseDetailItem)
	// 获取全部采购列表，用于级联选择框使用
	rg.POST("/purchase/getPurchaseListAll", api.GetPurchaseListAll)

}
